// 包含必要头文件：输入输出、线程操作、睡眠函数、字符串处理
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>

// 线程参数结构体：用于向线程函数传递复合参数
struct ThreadArg
{
    // 构造函数：初始化数字和字符串成员
    ThreadArg(int num, std::string str)
        : num_(num), str_(str)
    {
        
    }
    int num_;        // 循环次数
    std::string str_; // 待打印的字符串
};

// 线程执行函数：线程的核心逻辑在此实现
// 参数：void* 类型的参数（实际为ThreadArg结构体指针）
// 返回值：void* 类型（实际为std::string指针）
void *TestThreadFun(void *arg)
{
    // 将void*参数转换为ThreadArg指针（获取传递的参数）
    ThreadArg *targ = (ThreadArg*)arg;
    int num = targ->num_;  // 获取循环次数
    
    // 循环打印字符串和递减的数字，每次间隔1秒
    while(num--)
    {
        std::cout << "str:" << targ->str_ << std::endl;  // 打印字符串参数
        std::cout << "num: " << num << std::endl;        // 打印剩余循环次数
        sleep(1);  // 休眠1秒（模拟耗时操作）
    }
    
    // 动态分配字符串用于返回（需在线程外释放）
    std::string* retstr = new std::string("success");
    return (void*)retstr;  // 返回void*类型的指针
}

int main()
{
    pthread_t tid;  // 线程标识符
    
    // 创建线程参数对象（局部变量，生命周期到main函数结束）
    ThreadArg arg(3, "hello Thread");
    
    // 创建线程：
    // &tid：输出线程标识符
    // nullptr：使用默认线程属性
    // TestThreadFun：线程执行函数
    // (void*)&arg：传递参数（注意：此处传递局部变量地址，需确保线程结束前变量有效）
    pthread_create(&tid, nullptr, TestThreadFun, (void*)&arg);
    void* ret = nullptr;
    pthread_join(tid, &ret);
    
    // 将返回值转换为std::string指针并打印
    std::string* retstr = (std::string*)ret;
    std::cout << *retstr << std::endl;
    
    // 释放线程中动态分配的内存（避免内存泄漏）
    delete retstr;
    
    return 0;
}